package io.renren.common.utils;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import io.renren.common.utils.OSSClientUtil;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.UUID;

import static io.renren.common.utils.OSSClientUtil.getContentType;
import static java.lang.Character.FORMAT;

public class AliyunOSSClientUtil {

    private static Log log = LogFactory.getLog(OSSClientUtil.class);
    // endpoint以杭州为例，其它region请按实际情况填写
    private static String ENDPOINT = "http://oss-cn-qingdao.aliyuncs.com";
    // accessKey
    private static String ACCESS_KEY_ID = "LTAI5tGA8ND4fwfQnAYtv6gz";
    private static String ACCESS_KEY_SECRET = "7KxEbxJ1y905zwM1EVWnKeDWCubQpp";
    //空间
    private static String BUCKET_NAME = "1908aoss";
    //文件存储目录 data/
    private static String FOLDER_VIDEO = "brand/";


    public static String[] uploadObject2OSS(OSSClient ossClient, File file, String bucketName, String path) {
        String resultStr = null;
        String[] fo = new String[]{"", ""};
        try {
            // 以输入流的形式上传文件
            String folder = "";
            folder = path + "/" + FORMAT + "/";
            InputStream is = new FileInputStream(file);
            // 文件名
            String timefile = "/video";
            String fileName = file.getName();
            String uuid = UUID.randomUUID().toString().replace("-", "");
            fileName = uuid + fileName.substring(fileName.lastIndexOf("."));
            log.info("上传到路径" + folder + fileName);
            // 文件大小
            Long fileSize = file.length();
            // 创建上传Object的Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            // 上传的文件的长度
            metadata.setContentLength(is.available());
            // 指定该Object被下载时的网页的缓存行为
            metadata.setCacheControl("no-cache");
            // 指定该Object下设置Header
            metadata.setHeader("Pragma", "no-cache");
            // 指定该Object被下载时的内容编码格式
            metadata.setContentEncoding("utf-8");
            // 文件的MIME，定义文件的类型及网页编码，决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成，
            // 如果没有扩展名则填默认值application/octet-stream
            metadata.setContentType(getContentType(fileName));
            // 指定该Object被下载时的名称
            // inline ：将文件内容直接显示在页面
            // attachment：弹出对话框让用户下载
            // filename=cccc 就是下载下来的文件名filename/filesize=" + fileName + "/" + fileSize + "Byte.
            metadata.setContentDisposition("inline;filename=" + fileName);
            // 指定上传文件操作时是否覆盖同名Object。
            // 不指定x-oss-forbid-overwrite时，默认覆盖同名Object。
            // 指定x-oss-forbid-overwrite为false时，表示允许覆盖同名Object。
            // 指定x-oss-forbid-overwrite为true时，表示禁止覆盖同名Object，如果同名Object已存在，程序将报错。
            metadata.setHeader("x-oss-forbid-overwrite", "true");
            // 上传文件 (上传文件流的形式)
            PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata);
            // 解析结果
            resultStr = putResult.getETag();
            fo[1] = folder + fileName;
            fo[0] = resultStr;

            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
        }
        return fo;
    }

    public static OSSClient getOSSClient() {
        return new OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
    }

    public static String getUrl(OSSClient ossClient, String bucketName, String s) {
        Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
        // 生成URL
        URL url = ossClient.generatePresignedUrl(bucketName, s, expiration);
        if (url != null) {
            return url.toString();
        }
        return "获网址路径出错";
    }
}
